package com.haiheng.library_base.model

import androidx.annotation.Nullable
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import com.haiheng.library.log.LogUtils
import java.util.concurrent.atomic.AtomicBoolean
import android.icu.lang.UCharacter.GraphemeClusterBreak.T




/**
 *
 * @Des: 针对消息是一次性消费，解决数据倒灌问题
 * @Author: hwz
 * @Date:2022/10/11 0011
 * @Version: 1.0
 */
class SingleLiveEvent<T> : MutableLiveData<T>() {
    // 标志位，用于表达值是否被消费
    private val mPending: AtomicBoolean = AtomicBoolean(false)

    override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        // 中间观察者
        super.observe(owner!!, { t ->
            LogUtils.e("onChanged : ${t}")
            // 只有当值未被消费过时，才通知下游观察者
            if (mPending.compareAndSet(true, false)) {
                LogUtils.e("有当值未被消费过时，才通知下游观察者  onChanged : ${t}")
                observer.onChanged(t)
            }
        })
    }

    override fun setValue(@Nullable t: T?) {
        // 当值更新时，置标志位为 true
        LogUtils.e("当值更新时，置标志位为 true")
        mPending.set(true)
        super.setValue(t)
    }

    fun call() {
        setValue(null)
    }
}